// 注意！！！配置了路由守卫一定要去main.ts中导入，这样router才会生效

import router from '@/router'
import { refreshAsyncRouter } from '@/router'
import nprogress from 'nprogress'
import 'nprogress/nprogress.css'
import { useUserStore } from '@/stores'
import { asyncRoutes } from '@/router'
import role from '@/router/modules/role'

// 路由白名单
const whiteList = ['/login', '/404']
// 是否刷新路由
let isRefreshRouter: boolean = true
console.log('进入permission文件')

// 前置守卫
// router.beforeEach((到哪里去, 从哪来, 必须执行函数) => {})
router.beforeEach(async (to, from, next) => {
  console.log('进入路由守卫')

  nprogress.start()
  const userStore = useUserStore()

  // 有token的情况下，去登录页时转跳至主页；否则，放行
  // next()就是放行
  if (userStore.token) {
    // 去登录页时
    if (to.path === '/login') {
      next()
      nprogress.done()
    }
    // 非登录页
    else {
      // 判断是否获取用户信息，为进主页显示用户信息做准备，筛选路由
      if (!userStore.user.userId) {
        await userStore.getUser()

        // 添加动态路由
        var filterRoutes: any[] = []
        asyncRoutes.forEach((item: any) => {
          if (userStore.user.roles.menus.includes(item.name)) {
            router.addRoute(item)
            filterRoutes.push(item)
          }
        })
        console.log(filterRoutes[0])
        // 存储动态路由，渲染菜单用
        userStore.setRoutes(filterRoutes)

        router.addRoute({
          path: '/:catchAll(.*)',
          name: 'notFound',
          redirect: '/404'
        })

        // console.log('获取用户权限，添加动态路由后')
        // console.log('getRoutes', router.getRoutes())
        // console.log('matched', to.matched)
        // console.log('当前路由', router.currentRoute.value)

        isRefreshRouter = false
        //确保addRoute()时动态添加的路由已经被完全加载上去，不然刷新页面可能会导致空白
        next({ ...to, replace: true })
      } else {
        // console.log('有用户权限，直接放行')
        // console.log('getRoutes', router.getRoutes())
        // console.log('当前路由', router.currentRoute.value)
        next()
      }
    }
  }

  // 没有token的情况下，去登录页与404，放行；否则，拦截
  else {
    if (whiteList.includes(to.path)) {
      next()
    } else {
      next('/login')
      nprogress.done()
    }
  }
})

// 后置守卫
router.afterEach((to, from) => {
  nprogress.done()
})
